import * as Cesium from 'cesium';

/**
 * 离线资源工具函数
 * 提供使用本地免费资源替代Cesium Ion资源的功能
 */

/**
 * 创建使用本地资源的地形提供者
 * @param {Object} options - 选项
 * @returns {Cesium.EllipsoidTerrainProvider} 地形提供者
 */
export function createOfflineTerrainProvider() {
  // 对于离线使用，我们返回椭球体地形提供者作为默认选项
  // 这意味着没有实际的地形高程数据，地球将被视为光滑的椭球体
  console.info('使用椭球体地形提供者（无实际地形数据），避免访问Cesium Ion服务');
  return new Cesium.EllipsoidTerrainProvider();
}

/**
 * 创建使用本地资源的影像提供者（使用OpenStreetMap数据）
 * @param {Object} options - 选项
 * @returns {Cesium.OpenStreetMapImageryProvider} 影像提供者
 */
export function createOfflineImageryProvider() {
  try {
    // 使用OpenStreetMap作为默认的离线影像提供者
    return new Cesium.OpenStreetMapImageryProvider({
      url: 'https://a.tile.openstreetmap.org/'
    });
  } catch (error) {
    console.warn('无法创建OpenStreetMap影像提供者:', error);
    return undefined;
  }
}

/**
 * 创建使用本地模型的实体
 * @param {Cesium.Viewer} viewer - Cesium查看器
 * @param {Object} options - 选项
 * @param {String} options.url - 模型文件的URL
 * @param {Number} options.longitude - 经度
 * @param {Number} options.latitude - 纬度
 * @param {Number} options.height - 高度
 * @returns {Cesium.Entity} 实体
 */
export function createOfflineModelEntity(viewer, options) {
  const {
    url = '/assets/cesium-ion/Cesium_Air.glb',
    longitude = 0,
    latitude = 0,
    height = 0
  } = options;
  
  const position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
  
  return viewer.entities.add({
    position: position,
    model: {
      uri: url
    }
  });
}

/**
 * 创建使用本地纹理的材质
 * @param {Object} options - 选项
 * @param {String} options.image - 纹理图片的URL
 * @returns {Cesium.ImageMaterialProperty} 材质属性
 */
export function createOfflineImageMaterial(options = {}) {
  const { image = '/assets/cesium-ion/sample-cloud.png' } = options;
  
  return new Cesium.ImageMaterialProperty({
    image: image
  });
}

/**
 * 加载本地GeoJSON数据
 * @param {Object} options - 选项
 * @param {String} options.url - GeoJSON文件的URL
 * @returns {Cesium.GeoJsonDataSource} GeoJSON数据源
 */
export async function loadOfflineGeoJson(options = {}) {
  const { url = '/assets/cesium-ion/sample-data.geojson' } = options;
  
  try {
    const dataSource = await Cesium.GeoJsonDataSource.load(url);
    return dataSource;
  } catch (error) {
    console.error('加载离线GeoJSON数据失败:', error);
    return null;
  }
}

/**
 * 创建使用本地图片的广告牌
 * @param {Cesium.Viewer} viewer - Cesium查看器
 * @param {Object} options - 选项
 * @param {String} options.image - 图片URL
 * @param {Number} options.longitude - 经度
 * @param {Number} options.latitude - 纬度
 * @param {Number} options.height - 高度
 * @returns {Cesium.Entity} 实体
 */
export function createOfflineBillboard(viewer, options) {
  const {
    image = '/assets/cesium-ion/sample-cloud.png',
    longitude = 0,
    latitude = 0,
    height = 0
  } = options;
  
  const position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
  
  return viewer.entities.add({
    position: position,
    billboard: {
      image: image,
      scale: 1.0
    }
  });
}

export default {
  createOfflineTerrainProvider,
  createOfflineImageryProvider,
  createOfflineModelEntity,
  createOfflineImageMaterial,
  loadOfflineGeoJson,
  createOfflineBillboard
};